dot_product

语法:

dot_product(x1, y1, x2, y2)


参数 描述
x1 第一个向量的x坐标。
y1 第一个向量的y坐标。
x2 第二个向量的x坐标。
y2 第二个向量的y坐标。


返回: Real(实数)


描述

点积是一个表示两个向量之间角关系的值,先把两个向量相乘,然后把结果相加得到。名称 "点积" 是从中心点 "·"产生,通常用于指定此操作 (另一个可替代名称 "标量积" 强调标量, 而不是矢量性质的结果)。

数学公式如下:


在二维平面中, a[x1,y1]和b[x2,2] 的点积就是 x1x2 + y1y2,即 dot_product 在 GameMaker Studio 2 的计算公式是:

a · b = (x1*x2)+(y1*y2);

点积的奇怪之处在于它与输入向量形成的角度的关系, 该角度可以表示为:

a · b = (length of a) * (length of b) * cos(angle)

也就是说, 两个向量的点积将等于这些向量之间角度的余弦, 乘以每个向量的长度。这儿有张插图:

有几件事, 我们现在可以发现任何两个向量和它们的点积之间的关系:

这对我们做游戏有什么用呢?嗯, 这种数学关系可以在相当多的情况下使用, 但最好的方式是建立一个实际的场景, 自己看看发生了什么。其中一个最简单的方法是生成一个简单的 "视线" 检查敌人, 比如说, 一个平台跳跃游戏,如果玩家在敌人的矢量法线的两侧90度范围内,那么敌人将“看”到玩家。

基本上, 我们必须敌人的单位向量 (即: 由一个方向和视线距离组成) 然后我们就能得到玩家到敌人的矢量。然后我们将得到这些向量的点积, 如果点积计算结果是正的, 玩家已经被看到, 如果是否定的, 就没有被看到。下面的示例中提供了要完成此工作的实际代码。


例如:

var x1, y1, x2, y2;
x1 = lengthdir_x(1, image_angle);
y1 = lengthdir_y(1, image_angle);
x2 = o_Player.x - x;
y2 = o_Player.y - y;
if dot_product(x1, y1, x2, y2) > 0 seen=true else seen=false;

上面的代码使用实例图像角度创建一个向量, 然后获取玩家对象 "o _ player"的向量 。最后, 它计算这两个向量的点积, 如果它大于 0, 它将变量 "seen" 设置为 true, 如果它等于或小于 0, 它将其设置为 "false "。